package dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import model.Pessoa;

import org.apache.log4j.Logger;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;



public class PessoaDAOImp implements PessoaDAO {

	private JdbcTemplate jdbcTemplate;
	static Logger logger = Logger.getLogger( PessoaDAOImp.class.getName() );

	@SuppressWarnings("unused")
	private void init() {
		logger.info("creating database");

		StringBuilder sb = new StringBuilder();
		sb.append("CREATE TABLE pessoa (");
		//sb.append("id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY ("); // DERBY, DB2
		sb.append("id INTEGER NOT NULL AUTO_INCREMENT,");
		//sb.append("START WITH 1, INCREMENT BY 1),"); // DERBY, DB2
		sb.append(" nome VARCHAR(50),");
		sb.append(" CONSTRAINT primary_key PRIMARY KEY (id))");
		try {
			jdbcTemplate.execute(sb.toString());
			insert(new Pessoa("Henrique Barnabe"));
		} catch (DataAccessException e) {
			try {
				logger.info("database already exists. Deleting it again");
				jdbcTemplate.execute("drop table pessoa ");
				jdbcTemplate.execute(sb.toString());
				insert(new Pessoa("Henrique Barnabe"));
				
			} catch (Exception e2) {
				logger.warn("could not creat database");
			}

		    logger.debug("debug:");
			e.printStackTrace();
		}
	}

	@Override
	public void insert(Pessoa pessoa) {
		jdbcTemplate.update("INSERT INTO pessoa (nome) VALUES (?) ", new Object[]{pessoa.getNome()});
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Pessoa> select() {				
		List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT id, nome FROM pessoa");
		List<Pessoa> pessoas = new ArrayList<Pessoa>(list.size());
		for (Map<String, Object> map : list) {			
			Pessoa pessoa = new Pessoa();
			pessoa.setId(Integer.parseInt(map.get("ID").toString()));
			pessoa.setNome(map.get("NOME").toString());
			pessoas.add(pessoa);
		}
		return pessoas;
	}

	@Override
	public void delete(int id) {
		jdbcTemplate.update("DELETE FROM pessoa WHERE id=?", new Object[]{id});		
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}	

}

